package ee.ttu.frontend.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;




import ee.ttu.model.*;
import ee.ttu.repository.EttepanekRepository;
import ee.ttu.repository.KasutajaRepository;
import ee.ttu.repository.KlassifikaatorRepository;
import ee.ttu.repository.OppejoudRepository;
import ee.ttu.repository.RollEttepanekusRepository;


import ee.ttu.validator.WishValidator;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestParam;

@Service
public class WishServiceImpl implements WishService{

	@Autowired
	EttepanekRepository ettepanekRepository;
	
	@Autowired
	OppejoudRepository oppejoudRepository;
	
    
    @Autowired
    KlassifikaatorRepository klassifikaatorRepository;
    
    @Autowired
    KasutajaRepository kasutajaRepository;
    
    @Autowired
    RollEttepanekusRepository rollEttepanekusRepository;
    
    final static Logger logger = Logger.getLogger(WishService.class);


	/**
	 * Soovi andmete vaatamine
	 * @param soovId
	 * @return
	 */
	@Override
	public Ettepanek getSoov(long soovId) {
		Ettepanek soov = ettepanekRepository.findOne(soovId);
		return soov;

	}

	/**
	 * Kõikide soovide nimekirja väljastamine
	 * @return
	 */

	@Override
	public List<Ettepanek> getSoovid() {

		List<Ettepanek> soovid = (List<Ettepanek>) ettepanekRepository.findAll();
		return soovid;

	}

	/**
	 * Õppejõuga seotud soovide nimekirja kuvamine
	 * 
	 * Elion Sõber: tegin korda
	 * 
	 * @param oppejoud
	 * @return
	 */
	@Override
	public List<Ettepanek> getOppejouSoovid(long oppejouId){
		
		Oppejoud oppejoud = oppejoudRepository.findOne(oppejouId);
		
	
		
		List<Ettepanek> oppejouSoovid = new ArrayList<Ettepanek>();
		
		if (oppejoud != null){
		
		List<RollEttepanekus> oppejouRollidSoovis = oppejoud.getKasutaja().getKontoEttepanekud();

		if(oppejouRollidSoovis == null) return null;
		
		for(RollEttepanekus re : oppejouRollidSoovis){
			oppejouSoovid.add(re.getSeotudEttepanek());
		}
		}
		
		return oppejouSoovid;
		
	}
	
	  /**
     * Soovi aktsepteerimine
     * 
     * @param kasutajaNimi
     * @param id
     * @param model
     * @return
     */
    
    public void acceptWish(String kasutajaNimi, long id, Model model){

            List<String> errors = new ArrayList<String>();
            Ettepanek ettepanek = ettepanekRepository.findOne(id);
            String ettepanekuStaatusKood = ettepanek.getEttepanekuStaatus().getKood();
            
            Kasutaja kasutaja = kasutajaRepository.findByKontoNimi(kasutajaNimi);
            
           List<Oppejoud> koikOppejoud = (ArrayList<Oppejoud>) oppejoudRepository.findAll();
            Oppejoud oppejoud = null;
            
            for (int i = 0;i<koikOppejoud.size();i++){
                    if (koikOppejoud.get(i).getKasutaja().getId() == kasutaja.getId()){
                            oppejoud = koikOppejoud.get(i);
                    }
            }
            
            errors = WishValidator.validateAcceptWish(errors, ettepanekuStaatusKood);
            errors = WishValidator.validateWishTeacher(errors,kasutaja,ettepanek);
            errors = WishValidator.validateOppejoudKoormus(errors, oppejoud);
            
            if (errors.size() == 0){
                    Klassifikaator uusKlassifikaator = klassifikaatorRepository.findByKood("S3");
                    oppejoud.setKoormus(oppejoud.getKoormus()+1);
                    ettepanek.setEttepanekuStaatus(uusKlassifikaator);
                    oppejoudRepository.save(oppejoud);
                    ettepanekRepository.save(ettepanek);
            }
            else {
                    model.addAttribute("errors",errors);
            }
    }
    
    /**
     * Soovi tagasilukkamine
     * 
     * @param kasutajaNimi
     * @param id
     * @param model
     * @return
     */

    @Override
    public void declineWish(String kasutajaNimi, long id, Model model) {
            
           List<String> errors = new ArrayList<String>();
            Ettepanek ettepanek = ettepanekRepository.findOne(id);
            String ettepanekuStaatusKood = ettepanek.getEttepanekuStaatus().getKood();
            
            Kasutaja kasutaja = kasutajaRepository.findByKontoNimi(kasutajaNimi);

           List<Oppejoud> koikOppejoud = (List<Oppejoud>) oppejoudRepository.findAll();
            Oppejoud oppejoud = null;
            
            for (int i = 0;i<koikOppejoud.size();i++){
                    if (koikOppejoud.get(i).getKasutaja().getId() == kasutaja.getId()){
                            oppejoud = koikOppejoud.get(i);
                    }
            }

            errors = WishValidator.validateDeclinedWish(errors, ettepanekuStaatusKood);
            errors = WishValidator.validateWishTeacher(errors,kasutaja,ettepanek);
          
            
            if (errors.size() == 0){
                    // kui soov oi eelnevalt aktiivne siis koormust vähendatakse
                     if (ettepanekuStaatusKood.equals("S3") && oppejoud.getKoormus() > 0){
                             oppejoud.setKoormus(oppejoud.getKoormus()-1);
                             oppejoudRepository.save(oppejoud);
                     }
                    Klassifikaator uusKlassifikaator = klassifikaatorRepository.findByKood("S4");
                    
                    ettepanek.setEttepanekuStaatus(uusKlassifikaator);
                    ettepanekRepository.save(ettepanek);
            }
            else {
                    model.addAttribute("errors",errors);
            }
    }
    
    /**
     * Soovi aktiveerimine
     * 
     * @param kasutajaNimi
     * @param id
     * @param model
     * @return
     */

    @Override
    public void activateWish(String kasutajaNimi, long id, Model model) {
            List<String> errors = new ArrayList<String>();

            

            
            Ettepanek ettepanek = ettepanekRepository.findOne(id);
            String ettepanekuStaatusKood = ettepanek.getEttepanekuStaatus().getKood();
            
            Kasutaja oppejoudKasutaja = null;
            
            List<RollEttepanekus> l= (List<RollEttepanekus>) ettepanek.getEttepanekusOsalejad();
            
            for(int i=0;i<l.size();i++){
                    if (l.get(i).getRollEttepanekusTyyp().getKood().equals("RE1")== true){
                            oppejoudKasutaja = l.get(i).getSeotudKasutaja();
                    }
            }
            
            Kasutaja kasutaja = kasutajaRepository.findByKontoNimi(kasutajaNimi);
            
            List<Oppejoud> koikOppejoud = (List<Oppejoud>) oppejoudRepository.findAll();
            Oppejoud oppejoud = null;
            
            for (int i = 0;i<koikOppejoud.size();i++){
                    if (koikOppejoud.get(i).getKasutaja().getId() == oppejoudKasutaja.getId()){
                            oppejoud = koikOppejoud.get(i);
                    }
            }
            
            
            
            
            errors = WishValidator.validateActivatedWish(errors, ettepanekuStaatusKood);
            errors = WishValidator.validateWishCreator(errors, kasutaja,ettepanek);
            errors = WishValidator.validateOppejoudKoormus(errors, oppejoud);
            
            if (errors.size() == 0){
                    Klassifikaator uusKlassifikaator = klassifikaatorRepository.findByKood("S1");
                    
                    ettepanek.setEttepanekuStaatus(uusKlassifikaator);
                    ettepanekRepository.save(ettepanek);
            }
            else {
                    model.addAttribute("errors",errors);
            }
    }

    /**
     * Soovi deaktiveerimine
     * 
     * @param kasutajaNimi
     * @param id
     * @param mode
     * @return
     */
    @Override
    public void deactivateWish(String kasutajaNimi, long id, Model model) {
           List<String> errors = new ArrayList<String>();

            
            Ettepanek ettepanek = ettepanekRepository.findOne(id);
            String ettepanekuStaatusKood = ettepanek.getEttepanekuStaatus().getKood();
            
            Kasutaja kasutaja = kasutajaRepository.findByKontoNimi(kasutajaNimi);
            
            Kasutaja oppejoudKasutaja = null;
            
            List<RollEttepanekus> l= (List<RollEttepanekus>) ettepanek.getEttepanekusOsalejad();
            
            for(int i=0;i<l.size();i++){
                    if (l.get(i).getRollEttepanekusTyyp().getKood().equals("RE1") == true){
                            oppejoudKasutaja = l.get(i).getSeotudKasutaja();
                    }
            }
            

            
            List<Oppejoud> koikOppejoud = (List<Oppejoud>) oppejoudRepository.findAll();
            Oppejoud oppejoud = null;
            
            for (int i = 0;i<koikOppejoud.size();i++){
                    if (koikOppejoud.get(i).getKasutaja().getId() == oppejoudKasutaja.getId()){
                            oppejoud = koikOppejoud.get(i);
                    }
            }
            

            errors = WishValidator.validateDeactivatedWish(errors, ettepanekuStaatusKood);
            errors = WishValidator.validateWishCreator(errors, kasutaja,ettepanek);
            
            if (errors.size() == 0){
            	logger.info("Deactiveting wish ");
                    // kui soov oi eelnevalt aktiivne siis koormust vähendatakse
                     if (ettepanekuStaatusKood.equals("S3") && oppejoud.getKoormus() > 0){
                             oppejoud.setKoormus(oppejoud.getKoormus()-1);
                             oppejoudRepository.save(oppejoud);
                     }
                     
                    Klassifikaator uusKlassifikaator = klassifikaatorRepository.findByKood("S2");
                    
                    ettepanek.setEttepanekuStaatus(uusKlassifikaator);
                    ettepanekRepository.save(ettepanek);
            }
            else {
            
                    model.addAttribute("errors",errors);            }
    }

    /**
     * Soovi loomine
     * 
     * @param ettepanek
     * @param model
     * @return
     */
    
    @Override
    public void createWish(String title,String description,String topicCode,String studentUsername,String teacherUsername, Model model) {
            // kontrolli enne seda ka kas õppejõu koormus on alla 10
    		
    		List<String> errors = new ArrayList<String>();
    	       
    		
             List<Oppejoud> koikOppejoud = (List<Oppejoud>) oppejoudRepository.findAll();
             Oppejoud oppejoud = null;
              
             if (kasutajaRepository.findByKontoNimi(teacherUsername) != null && kasutajaRepository.findByKontoNimi(teacherUsername).getKasutajaTyyp().getKood().equals("K1")== true){
              for (int i = 0;i<koikOppejoud.size();i++){
                      if (koikOppejoud.get(i).getKasutaja().getId() == kasutajaRepository.findByKontoNimi(teacherUsername).getId()){
                              oppejoud = koikOppejoud.get(i);
                      }
              }
              Klassifikaator valdkond = klassifikaatorRepository.findByKood(topicCode);
              Kasutaja opilane = kasutajaRepository.findByKontoNimi(studentUsername);
              Kasutaja kasutajaOppejoud = kasutajaRepository.findByKontoNimi(teacherUsername);
                errors = WishValidator.validateEttepanek(errors,valdkond,opilane,kasutajaOppejoud);
        		errors = WishValidator.validateOppejoudKoormus(errors,oppejoud);
             }
             else {
            	 errors.add("User is not a teacher!");
             }
            
            
            if (errors.size() == 0){
            	
            
            	Ettepanek ettepanek = new Ettepanek();
        		ettepanek.setPealkiri(title);
        		ettepanek.setKirjeldus(description);
        		ettepanek.setValdkond(klassifikaatorRepository.findByKood(topicCode));
        		ettepanek.setEttepanekuStaatus(klassifikaatorRepository.findByKood("S1"));
        		ettepanek.setEttepanekuTyyp(klassifikaatorRepository.findByKood("OFF01"));
        		Date loodud = new Date();
        		ettepanek.setLoodud(loodud);
        		

            	
            
            	
        		RollEttepanekus opilaseRoll =new RollEttepanekus();
        		opilaseRoll.setSeotudEttepanek(ettepanek);
        		opilaseRoll.setRollEttepanekusTyyp(klassifikaatorRepository.findByKood("RE2"));
        		opilaseRoll.setSeotudKasutaja(kasutajaRepository.findByKontoNimi(studentUsername));
        		
        		RollEttepanekus opetajaRoll =new RollEttepanekus();
        		opetajaRoll.setSeotudEttepanek(ettepanek);
        		opetajaRoll.setRollEttepanekusTyyp(klassifikaatorRepository.findByKood("RE1"));
        		opetajaRoll.setSeotudKasutaja(kasutajaRepository.findByKontoNimi(teacherUsername));
            
            	ettepanekRepository.save(ettepanek);
            	rollEttepanekusRepository.save(opilaseRoll);
            	rollEttepanekusRepository.save(opetajaRoll); 
            }
            else {
                model.addAttribute("errors",errors); }
            
                            
    }
    /** Olemasolevate soovi andmete muutmine
     * 
     * @param ettepanek
  
     * @param model
     * @return
     */
	@Override
	public void changeWish(long wishId, String title,String description,String studentUserName, Model model) {
		
		List<String> errors = new ArrayList<String>();
		Ettepanek ettepanek = ettepanekRepository.findOne(wishId);
		Kasutaja kasutaja = kasutajaRepository.findByKontoNimi(studentUserName);
		
		if (ettepanek!= null&&kasutaja!=null){
			
			errors = WishValidator.validateWishCreator(errors,kasutaja,ettepanek);
		 } 
          
        
        if (errors.size() == 0){
        	ettepanek.setPealkiri(title);
        	ettepanek.setKirjeldus(description);
        	ettepanekRepository.save(ettepanek);
        }
        else {
            model.addAttribute("errors",errors); }
	}

	

}
